package com.zkh.myutils.utils;

import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import com.zkh.myutils.bean.TypeConverter;
import com.zkh.myutils.bean.TypeConverterItem;
import com.zkh.myutils.json.JSON;
import com.zkh.myutils.json.JSONObject;

/**
 * JSON工具类
 * @author zkh
 *
 */
public class JSONUtils {
	/**
	 * 将任意对象转换为JSON对象。<br /><br />
	 * 
	 * <b>Date类型（target instanceof java.util.Date）的值请在属性上使用Format注解，
	 * 没有注解默认转为“yyyy-MM-dd HH:mm:ss”格式</b>
	 * @param obj 任意对象
	 * @return
	 */
	public static JSON getJSON(Object obj){
		return JSON.getJSON(obj);
	}
	
	/**
	 * 将任意对象转换为JSON对象
	 * @param obj 任意对象
	 * @param dateFormat 日期类型格式。如：yyyy-MM-dd HH:mm:ss<br>
	 * <b>注：此处的日期格式优先级大于Format注解。对java.util.Date类和java.sql.Timestamp类有效。
	 * @return
	 */
	public static JSON getJSON(Object obj, final String dateFormat){
		//使用转换器
		TypeConverter converter = new TypeConverter();
		/*** 注册转换对象 ***/
		//Date类型
		converter.registerItemConverter(new TypeConverterItem<Date>(Date.class) {
			public Object convertToTarget(Date value) {
				return DateUtils.getDate(value, dateFormat);
			}
			public Date convertToProperty(Object val) {
				return DateUtils.getDate(val.toString(), dateFormat);
			}
		});
		//java.sql.Timestamp类型
		converter.registerItemConverter(new TypeConverterItem<Timestamp>(Timestamp.class) {
			public Object convertToTarget(Timestamp value) {
				return DateUtils.getDate(value, dateFormat);
			}
			public Timestamp convertToProperty(Object val) {
				return new Timestamp(DateUtils.getDate(val.toString(), dateFormat).getTime());
			}
		});
		//返回JSON对象
		return JSON.getJSON(obj, converter);
	}
	
	/**
	 * 将JSON格式的字符串转为Map集合。<br />
	 * <b>仅支持符合键值对的JSON字符串</b>
	 * @param jsonString
	 * @return
	 */
	public static Map<String, String> parseJSON(String jsonString){
		//容器
		Map<String, String> ctn = new HashMap<String, String>();
		//转为JSON对象
		JSONObject json = new JSONObject(jsonString);
		//获取转换后的值
		@SuppressWarnings("unchecked")
		Map<String, Object> map = json.parseEntity(Map.class);
		//遍历转换
		for(Entry<String, Object> kv: map.entrySet()) {
			ctn.put(kv.getKey(), kv.getValue()==null ? null : kv.getValue().toString());
		}
		//返回
		return ctn;
	}
}